package main

import (
	"fmt"
)

//栈的应用场景
//1) 子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,
//直到子程序执行完后再将地址取出,以回到原来的程序中
//处理递归调用:和子程序的调用类似,只是除了存储下一个指令地址外,
//也将参数,区域变量等数据存入堆栈中
//3)表达式的转换与求值
//4)二叉树的遍历
//5)图形的深度优化(depth-first) 搜索算法

type Stack struct {
	MaxTop int //表示栈存放的最大数
	Top    int //表示栈顶, 因为栈底固定,因此我们直接使用Top
	arr    [5]int
}

func (this *Stack) Pop() (val int) {
	if this.Top == -1 {
		fmt.Println("empty")
		return
	}
	val = this.arr[this.Top]
	this.Top--
	return
}
func (this *Stack) List() {
	//先判断栈是否为空
	if this.Top == -1 {
		fmt.Println("栈为空")
		return
	}
	for i := this.Top; i >= 0; i-- {
		fmt.Printf("arr[%d]=%v\t", i, this.arr[i])
	}
}
func (this *Stack) Push(val int) (err error) {
	if this.Top == this.MaxTop-1 {
		fmt.Println("stack full")
		return
	}
	this.Top++
	this.arr[this.Top] = val
	return
}
